Ruby 日記 35日目: Enumeratorオブジェクトの構造
#Ruby_日記 #2021-10-01
https://rex.libertyfish.co.jp/exam_histories/42141/user_answers/35060b0e-5477-4716-933f-e8316a4ffed6
次のプログラムの実行結果を得るために__(1)__に適切なメソッドをすべて選んでください。
code:rb
class Array
def succ_each(step = 1)
return __(1)__(__method__, step) unless block_given?
each do |int|
yield int + step
end
end
end
97, 98, 99.succ_each.map {|int|
p int.chr
}
code:実行結果
"b"
"c"
"d"
選択肢:
enum
enum_chr
to_enum
enum_for
解説:
類似問題は
Ruby 日記 26日目: Enumeratorオブジェクトを返す
Ruby 日記 29日目: Enumerableなメソッドを作るとき、ブロックが渡されなかった場合にはメソッドチェーンできるようにEnumeratorオブジェクトを返す
あたりかな
Object#to_enumとObject#enum_forは必須知識だね〜
instance method Object#enum_for (Ruby 2.1.0)
to_enum(method = :each, *args) -> Enumerator
enum_for(method = :each, *args) -> Enumerator
to_enum(method = :each, *args) {|*args| ... } -> Enumerator
enum_for(method = :each, *args) {|*args| ... } -> Enumerator
Enumerator.new(self, method, *args) を返します。
ブロックを指定した場合は Enumerator#size がブロックの評価結果を返 します。ブロックパラメータは引数 args です。
正解は「to_enum」と「enum_for」だ
code:sh
# ruby gold/ex35/choice01.rb
gold/ex35/choice01.rb:3:in succ_each': undefined method enum' for 97, 98, 99:Array (NoMethodError)
from gold/ex35/choice01.rb:11:in `<main>'
# ruby gold/ex35/choice02.rb
gold/ex35/choice02.rb:3:in succ_each': undefined method enum_chr' for 97, 98, 99:Array (NoMethodError)
from gold/ex35/choice02.rb:11:in `<main>'
# ruby gold/ex35/choice03.rb
"b"
"c"
"d"
# ruby gold/ex35/choice04.rb
"b"
"c"
"d"
/icons/hr.icon
Enumeratorオブジェクトって、入れ子構造になっているんだね。
code:gold/ex35/sample.rb
class Array
def succ_each(step = 1)
return to_enum(__method__, step) unless block_given?
each do |int|
yield int + step
end
end
end
enumerator = 97, 98, 99.succ_each
p enumerator
p enumerator.map
p enumerator.reverse_each.map
p enumerator.reverse_each.map { |elm| elm, elm.chr }
code:sh
# ruby gold/ex35/sample.rb
#<Enumerator: 97, 98, 99:succ_each(1)>
#<Enumerator: #<Enumerator: 97, 98, 99:succ_each(1)>:map>
#<Enumerator: #<Enumerator: #<Enumerator: 97, 98, 99:succ_each(1)>:reverse_each>:map>
100, "d"], 99, "c", [98, "b"
#<Enumerator: #<Enumerator: ...>:method(args)>